package com.kmxd.ams.core.util;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * description
 *
 * @author nickbi
 */
@Slf4j
public class WordUtil {
  /**
   * word模板替换导出
   *
   * @param srcPath 模板文件的地址
   * @param destPath 导出的文件保存地址
   * @param map 替换的内容
   * @return
   */
  public static void replaceTmpl(File srcPath, String destPath, Map<String, Object> map) {
    try {
      // 替换的的关键字存放到Set集合中
      Set<String> set = map.keySet();
      // 读取模板文档
      XWPFDocument document = new XWPFDocument(new FileInputStream(srcPath));
      /** 替换段落中的指定文字 */
      // 读取文档中的段落，回车符为一个段落。
      // 同一个段落里面会被“:”等符号隔开为多个对象
      Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
      while (itPara.hasNext()) {
        // 获取文档中当前的段落文字信息
        XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
        List<XWPFRun> run = paragraph.getRuns();
        // 遍历段落文字对象
        for (int i = 0; i < run.size(); i++) {
          // 获取段落对象
          if (run.get(i) == null) { // 段落为空跳过
            continue;
          }
          String sectionItem = run.get(i).getText(run.get(i).getTextPosition()); // 段落内容
          if (StrUtil.isBlank(sectionItem)) {
            continue;
          }
          // 遍历自定义表单关键字，替换Word文档中的内容
          Iterator<String> iterator = set.iterator();
          while (iterator.hasNext()) {
            // 当前关键字
            String key = iterator.next();
            // 替换内容
            sectionItem = sectionItem.replace(key, String.valueOf(map.get(key)));
          }
          run.get(i).setText(sectionItem, 0);
        }
      }

      /** 替换表格中的指定文字 */
      // 获取文档中所有的表格，每个表格是一个元素
      Iterator<XWPFTable> itTable = document.getTablesIterator();
      while (itTable.hasNext()) {
        XWPFTable table = (XWPFTable) itTable.next(); // 获取表格内容
        int count = table.getNumberOfRows(); // 表格的行数
        // 遍历表格行的对象
        for (int i = 0; i < count; i++) {
          XWPFTableRow row = table.getRow(i); // 表格每行的内容
          List<XWPFTableCell> cells = row.getTableCells(); // 每个单元格的内容
          // 遍历表格的每行单元格对象
          for (int j = 0; j < cells.size(); j++) {
            XWPFTableCell cell = cells.get(j); // 获取每个单元格的内容
            List<XWPFParagraph> paragraphs = cell.getParagraphs(); // 获取单元格里所有的段落
            for (XWPFParagraph paragraph : paragraphs) {
              // 获取段落的内容
              List<XWPFRun> run = paragraph.getRuns();
              // 遍历段落文字对象
              for (int o = 0; o < run.size(); o++) {
                // 获取段落对象
                if (run.get(o) == null || run.get(o).equals("")) {
                  continue;
                }
                String sectionItem = run.get(o).getText(run.get(o).getTextPosition()); // 获取段落内容
                if (sectionItem == null || sectionItem.equals("")) { // 段落为空跳过
                  continue;
                }
                // 遍历自定义表单关键字，替换Word文档中表格单元格的内容
                for (String key : map.keySet()) {
                  // 替换内容
                  sectionItem = sectionItem.replace(key, String.valueOf(map.get(key)));
                  run.get(o).setText(sectionItem, 0);
                }
              }
            }
          }
        }
      }
      FileOutputStream outStream = null;
      outStream = new FileOutputStream(destPath);
      document.write(outStream);
      outStream.close();
    } catch (Exception e) {
      log.error(e.getMessage(), e);
    }
  }
}
